﻿#include "App.h"

///////////////////////////////////////////////////////////////////////////
//// создание 2D текстуры
//bool createTexture(GLuint *texture, const char* filename)
//{
//	if (!texture || !filename)
//		return false;
//
//	// активизируем текстурный юнит 0
//	glActiveTexture( GL_TEXTURE0 );
//
//	// содержит raw данные изображения
//	cPyxel *bitmap = NULL;
//
//	if (!ilLoadImage(filename))
//		return false;
//
//	// получаем всю информацию об изображении
//	int _width  = ilGetInteger( IL_IMAGE_WIDTH );
//	int _height = ilGetInteger( IL_IMAGE_HEIGHT ); 
//	int _Format = ilGetInteger ( IL_IMAGE_FORMAT );
//	int _Type   = ilGetInteger ( IL_IMAGE_TYPE );
//	int _Depth  = ilGetInteger ( IL_IMAGE_DEPTH );
//	int _bpp    = ilGetInteger( IL_IMAGE_BPP );
//
//	if (_bpp != 3)
//		return false;
//
//	// выделяем память для bitmap
//	bitmap = new cPyxel[ _width * _height ];
//
//	// копируем данные из DevIL в pixdata
//	ilCopyPixels(0, 0, 0, _width, _height, _Depth, _Format, _Type, bitmap);
//
//	glGenTextures(1, texture);
//
//	glBindTexture(GL_TEXTURE_2D, *texture);
//
//	// установим параметры фильтрации текстуры - линейная фильтрация
//	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//
//
//	glTexImage2D(GL_TEXTURE_2D, 
//		0,
//		_Format,
//		_width,
//		_height,
//		0,
//		_Format,
//		_Type, 
//		bitmap);
//
//	// проверяем на ошибки
//	GLenum g_OpenGLError;
//	if( (g_OpenGLError = glGetError()) != GL_NO_ERROR )
//		return false;
//
//	return true;
//}
/////////////////////////////////////////////////////////////////////////////
//// загрузка и компиляция шейдера
//uint loadShader( const char* fileName, GLenum type)
//{
//	int len;
//	const char* data;
//	int statusCompile;
//	std::string strBuff;
//
//	std::ifstream inFile( fileName, std::ios::in );
//	if ( !inFile.is_open() )
//		return -1;
//	//узнаем размер файла, и выделяем память в строке
//	inFile.seekg( 0, std::ios_base::end );
//	strBuff.resize( inFile.tellg() );
//	inFile.seekg( 0, std::ios_base::beg );
//
//	//копируем данные
//	inFile.read( (char*)strBuff.data(), strBuff.size() );
//	data = strBuff.c_str();
//
//	len   = strlen ( data );
//
//	uint shader = glCreateShader( type );
//
//	glShaderSource( shader, 1, &data, &len );
//
//	// компиляция
//	glCompileShader( shader );
//
//	// проверка статуса откомпилированного шейдера
//	glGetShaderiv ( shader, GL_COMPILE_STATUS, &statusCompile );
//	if ( statusCompile == 0)
//		return -1;
//
//	return shader;
//}
/////////////////////////////////////////////////////////////////////////////
//// создание шейдерной программы
//uint createProgram( /*const char* patchFile*/ )
//{
//	uint program = glCreateProgram();
//	uint vs = 0, fs = 0;
//
//	//vs = loadShader( "../data/shaders/base.vert" /*patchFile*/, GL_VERTEX_SHADER );
//	//fs = loadShader( "../data/shaders/base.frag" /*patchFile*/, GL_FRAGMENT_SHADER );
//	vs = loadShader( "data/shaders/base.vert" /*patchFile*/, GL_VERTEX_SHADER );
//	fs = loadShader( "data/shaders/base.frag" /*patchFile*/, GL_FRAGMENT_SHADER );
//	if ( (vs || fs) == 0 )
//		return -1;
//
//	int statusLinked;
//
//	glAttachShader( program, vs );	// присоединим загруженные шейдеры к шейдерной программе
//	glAttachShader( program, fs );
//	glLinkProgram( program );		// сборка шейдерной программы из прикрепленных шейдеров
//
//	glGetProgramiv( program, GL_LINK_STATUS, &statusLinked );
//
//	if (!statusLinked)// TODO: log error
//		return -1;
//
//	return program;
//}
//
//bool setAttrPtr( uint program, const char * name, int numComponents, GLsizei stride, void * ptr, GLenum typeVar, bool normalized )
//{
//	// получить индекс атрибута из шейдерной программы
//	int	location = glGetAttribLocation ( program, name );
//	if( location < 0 ) return false;
//	// параметры вершинного атрибута для активного VBO
//	glVertexAttribPointer( location,             // index
//		numComponents,        // number of values per vertex
//		typeVar,              // type (GL_FLOAT)
//		normalized ? GL_TRUE : GL_FALSE,
//		stride,               // stride (offset to next vertex data)
//		(const void*)ptr );
//	// разрешить использовать вершинный атрибут
//	glEnableVertexAttribArray ( location );
//	return true;
//}
//
//bool setAttrPtr(int vertLoc, int numComponents, GLsizei stride, void * ptr, GLenum typeVar, bool normalized )
//{
//	// параметры вершинного атрибута для активного VBO
//	glVertexAttribPointer( vertLoc,              // index
//		numComponents,        // number of values per vertex
//		typeVar,              // typeVar (GL_FLOAT)
//		normalized ? GL_TRUE : GL_FALSE,
//		stride,               // stride (offset to next vertex data)
//		(const void*)ptr );
//	// разрешить использовать вершинный атрибут
//	glEnableVertexAttribArray ( vertLoc );
//	return true;
//}
//
//bool setUniform1f( uint program, const char* nameUnif, float v0 )
//{
//	int location = glGetUniformLocation( program, nameUnif );
//	if ( location < 0 )
//		return false;
//	glUniform1f( location, v0 );
//	return true;
//}
//
//bool setUniform2f( uint program, const char* nameUnif, float v0, float v1 )
//{
//	int location = glGetUniformLocation( program, nameUnif );
//	if ( location < 0 )
//		return false;
//	glUniform2f( location, v0, v1 );
//	return true;
//}
//
//bool setUniform3f( uint program, const char* nameUnif, float v0, float v1, float v2 )
//{
//	int location = glGetUniformLocation( program, nameUnif );
//	if ( location < 0 )
//		return false;
//	glUniform3f( location, v0, v1, v2 );
//	return true;
//}
//
//bool setUniform4f( uint program, const char* nameUnif, float v0, float v1, float v2, float v3 )
//{
//	int location = glGetUniformLocation( program, nameUnif );
//	if ( location < 0 )
//		return false;
//	glUniform4f( location, v0, v1, v2, v3 );
//	return true;
//}
//
//int getsUniform1i( uint program, const char* nameUnif, float v0 )
//{
//	int location = glGetUniformLocation( program, nameUnif );
//	if ( location < 0 )
//		return -1;
//	glUniform1i( location, v0 );
//	return location;
//}
//
//bool setUniform2i( uint program, const char* nameUnif, float v0, float v1 )
//{
//	int location = glGetUniformLocation( program, nameUnif );
//	if ( location < 0 )
//		return false;
//	glUniform2i( location, v0, v1 );
//	return true;
//}
//
//bool setUniform3i( uint program, const char* nameUnif, float v0, float v1, float v2 )
//{
//	int location = glGetUniformLocation( program, nameUnif );
//	if ( location < 0 )
//		return false;
//	glUniform3i( location, v0, v1, v2 );
//	return true;
//}
//
//bool setUniform4i( uint program, const char* nameUnif, float v0, float v1, float v2, float v3 )
//{
//	int location = glGetUniformLocation( program, nameUnif );
//	if ( location < 0 )
//		return false;
//	glUniform4i( location, v0, v1, v2, v3 );
//	return true;
//}
//
//bool setUniformMatrix2fv( uint program, const char* nameUnif, GLsizei count, GLboolean transpose, const GLfloat *val )
//{
//	int location = glGetUniformLocation( program, nameUnif );
//	if ( location < 0 )
//		return false;
//	glUniformMatrix2fv( location, count, transpose, val);
//}
//
//bool setUniformMatrix3fv( uint program, const char* nameUnif, GLsizei count, GLboolean transpose, const GLfloat *val )
//{
//	int location = glGetUniformLocation( program, nameUnif );
//	if ( location < 0 )
//		return false;
//	glUniformMatrix3fv( location, count, transpose, val);
//}
//
//int getsUniformMatrix4fv( uint program, const char* nameUnif, GLsizei count, GLboolean transpose, const GLfloat *val )
//{
//	static int location = glGetUniformLocation( program, nameUnif );
//	if ( location < 0 )
//		return -1;
//	glUniformMatrix4fv( location, count, transpose, val);
//
//	return location;
//}
//
//bool setUniformMatrix4fv( uint program, int location, GLsizei count, GLboolean transpose, const GLfloat *val )
//{
//	glUniformMatrix4fv( location, count, transpose, val );
//
//	return true;
//}